iT邦幫忙

2026 iThome 鐵人賽

DAY 25
0
IT Operation

迎接 AI 開發爆發期:告別手動部署,帶領企業團隊從 Git 規範到 CI/CD 實戰系列 第 25

Day 25 MyDeploy.jenkinsfile (下) — 遠端部署與 PR 即時反饋

  • 分享至 

  • xImage
  •  

前言

延續前一篇的建置流程,我們已完成程式碼編譯與「配置渲染」,並產出了包含環境設定的 Zip 壓縮檔。本篇將實作如何跨網路將產出物安全送達目標主機,並在部署成功後,透過 Jenkins 自動在 GitHub 的 Pull Request (PR) 下方進行即時反饋。

遠端部署:跨平台派送實務

在混合雲或異質環境中,Jenkins Agent 可能運行於 Linux,而部署目標則是 Windows 伺服器。我們採用 OpenSSH for Windows 作為兩者間的通訊橋樑,實現標準化的指令與檔案傳輸。

1. 檔案傳送與任務觸發

我們利用 sshpass 處理非互動式的密碼輸入(密碼由 Vault 動態注入),並透過 scp 確保檔案傳輸的完整性。針對測試環境,我們的目標 IP 為 <STAGING_IP>

stage('Transfer & Deploy') {
    steps {
        withVault([configuration: vaultConfig, vaultSecrets: [[path: 'secret/deploy/target', secretValues: [[envVar: 'SSH_PASS', vaultKey: 'password']]]]]) {
            script {
                def targetIp = (params.DEPLOY_ENV == 'Prod') ? '<PROD_IP>' : '<STAGING_IP>'
                sh """
                # 1. 安全傳送產出物與元數據檔案至目標主機暫存區
                sshpass -p $SSH_PASS scp -o StrictHostKeyChecking=no ${env.ZIP_NAME} deploy_params.json administrator@${targetIp}:D:/AP/Incoming/
                
                # 2. 透過 SSH 觸發 Windows 任務排程器執行預定義的部署作業
                sshpass -p $SSH_PASS ssh -o StrictHostKeyChecking=no administrator@${targetIp} "schtasks /run /tn DeploySite"
                """
            }
        }
    }
}

人工核准機制 (Manual Approval)

針對生產環境 (Prod) 的變更,自動化應具備「安全閥」。透過 input 指令讓 Pipeline 在關鍵節點暫停,等待授權人員審查。

stage('Production Approval') {
    when { expression { return params.DEPLOY_ENV == 'Prod' } }
    steps {
        script {
            // 設定超時機制,若 2 小時內未獲核准則自動撤銷任務
            timeout(time: 2, unit: 'HOURS') {
                input message: "確認將專案 ${params.PROJECT_ID} 部署至正式環境?", ok: "執行部署"
            }
        }
    }
}

PR 即時反饋:優化開發者體驗 (DX)

部署完成後,系統應主動將結果回傳至開發者的工作介面(如 GitHub PR 頁面)。這能讓 Code Reviewer 即時得知部署狀態,並透過連結直接驗證功能成果。

post {
    success {
        script {
            def demoUrl = (params.PR_NUMBER) ? "https://ci-cd.example.com/demo/${params.PROJECT_ID}-PR${params.PR_NUMBER}" : "https://ci-cd.example.com/demo/${params.PROJECT_ID}"
            def comment = "🚀 **Deployment Successful!** \n\n- **Project**: ${params.PROJECT_ID} \n- **Env**: ${params.DEPLOY_ENV} \n- **Artifact**: ${env.ZIP_NAME} \n- **Demo URL**: ${demoUrl}"
            
            // 透過 API 在 Pull Request 下方留言
            withCredentials([string(credentialsId: 'github-token', variable: 'GITHUB_TOKEN')]) {
                sh """
                curl -X POST -H "Authorization: token ${GITHUB_TOKEN}" \
                     -d '{"body": "${comment}"}' \
                     "https://api.github.com/repos/my-org/my-repo/issues/${env.PR_NUMBER}/comments"
                """
            }
        }
    }
}

實施效益總結

  1. 閉環回饋系統:開發者從提交程式碼到獲知部署結果,全程在單一介面完成,大幅降低切換上下文的成本。
  2. 安全性與合規性:結合 Vault 秘密管理與生產環境的人工核准,實現了交付速度與作業安全性的平衡。
  3. 架構解耦設計:Jenkins 專注於流程調度與決策,而目標主機則負責具體的安裝執行,兩者透過標準化的元數據檔案進行溝通。

在完成了管線端的實作後,明天的文章我們將深入探討 Windows 主機端是如何接收指令,並解析 DeploySite.ps1 部署腳本的設計精髓。


上一篇
Day 24 MyDeploy.jenkinsfile (上) — 建置打包與配置渲染實務
下一篇
Day 26 跨平台派送實務:sshpass、scp 與 Windows OpenSSH 配置
系列文
迎接 AI 開發爆發期:告別手動部署,帶領企業團隊從 Git 規範到 CI/CD 實戰30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言